Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

부록 B. 자주 사용하는 Collection 함수

백엔드에서 특히 자주 쓰는
컬렉션 함수를 용도별로 모았습니다.
(자세한 설명은 13장 참고)

예제에 쓸 데이터를 먼저 가정합니다.

data class User(val id: Long, val name: String, val age: Int)

val users = listOf(
    User(1, "홍길동", 20),
    User(2, "김철수", 35),
    User(3, "이영희", 28)
)

조회

users.first()                     // 첫 번째
users.firstOrNull()               // 첫 번째 (없으면 null)
users.find { it.age > 30 }        // 조건에 맞는 첫 번째
users.getOrNull(10)               // 인덱스 접근 (없으면 null)

“없을 수 있는” 조회는
~OrNull을 써서 안전하게.


필터

users.filter { it.age >= 30 }         // 조건에 맞는 것만
users.filterNot { it.age >= 30 }      // 조건에 안 맞는 것만
users.filterNotNull()                 // null 제거
names.mapNotNull { it.toIntOrNull() } // 변환하며 null 제거

변환

users.map { it.name }                 // 각각 변환
users.map { it.age * 2 }
users.flatMap { it.orders }           // 중첩 목록 펼치기
users.mapNotNull { it.emailOrNull() } // 변환 + null 제거

그룹

users.groupBy { it.age / 10 }         // 나이대별 그룹
users.associateBy { it.id }           // id를 키로 하는 Map
users.associate { it.id to it.name }  // 키-값 쌍으로 Map
users.partition { it.age >= 30 }      // 조건으로 두 그룹 분리

associateBy는 특히 자주 씁니다.

val userMap: Map<Long, User> = users.associateBy { it.id }
val user = userMap[1]   // id로 빠르게 조회

정렬

users.sortedBy { it.age }               // 오름차순
users.sortedByDescending { it.age }     // 내림차순
users.sortedWith(compareBy({ it.age }, { it.name }))  // 다중 기준
users.distinct()                        // 중복 제거
users.distinctBy { it.name }            // 특정 기준 중복 제거

집계

users.count()                       // 개수
users.count { it.age >= 30 }        // 조건 개수
users.sumOf { it.age }              // 합계
users.maxByOrNull { it.age }        // 최댓값 요소
users.minByOrNull { it.age }        // 최솟값 요소
users.map { it.age }.average()      // 평균

users.any { it.age >= 30 }          // 하나라도 참인가
users.all { it.age >= 20 }          // 모두 참인가
users.none { it.age < 0 }           // 하나도 없는가

누적 계산이 필요하면 fold/reduce를 씁니다.

val total = users.fold(0) { acc, u -> acc + u.age }

자주 쓰는 조합

// 30세 이상 회원의 이름만
users.filter { it.age >= 30 }.map { it.name }

// 나이대별 인원 수
users.groupBy { it.age / 10 }.mapValues { it.value.size }

// 조건에 맞는 총합
users.filter { it.age >= 20 }.sumOf { it.age }

이 조합 패턴이
백엔드 데이터 가공의 대부분을 차지합니다.